Technical Q&A QA1306
Rendezvous enforces the TXT record format in Panther


Q: Mac OS X 10.3 で新しく導入された DNSServiceDiscovery API を使用していますが、DNSServiceRegister への呼び出しから -65549 という値が返されます。何が起きているのでしょう。

A: Mac OS X 10.3 以降の mDNSResponder では、TXT レコードをはじめとする登録レコードが、DNS の仕様に従った正しい形式である必要があります。TXT レコードの形式が正しくないと、次のようなメッセージがシステムのログ(/var/log/system.log)に出力されます。



リスト 1. system.log のメッセージ

Sep 15 16:06:13 localhost mDNSResponder[192]:Attempt to register record
with invalid rdata:17 Ice Cube._http._tcp.local. TXT ath=/index.html


DNS-SD プロトコル仕様によれば、Rendezvous の TXT レコードの形式は、「メモリ上で途切れのない、ワード境界合わせのパディングバイトもない、パック化された、0 個または 1 個以上の文字列」で構成され、「DNS TXT レコードを構成する各文字列の形式は、長さを示す 1 バイトと、それに続く 0 〜 255 バイトのテキストデータである」とあります。たとえば、

¥009txtvers=1¥010path=/index.html¥018note=Rendezvous Is Cool! という具合です。

Mac OS X 10.2.x では、Rendezvous API によって、DNS TXT レコードを構成する文字列の区切りとして ASCII コードの 1("¥001")が使用されます。最終的に TXT レコードは自動的に正しい形式に変換されます。次は、ASCII コードの 1 を文字列の区切りとして使用している TXT レコードの例です。

txtvers=1¥001path=/index.html¥001note=Rendezvous Is Cool!

Mac OS X 10.3 以降では、CFNetServices、NSNetSerivces および古い DNSServiceDiscovery API は、依然として ASCII コードの 1 を区切りとして使用しますが、DNSServiceRegisterDNSServiceRegisterRecord などの新しく登場したルーチンでは、TXT レコードが DNS-SD 仕様に従った正しい形式になっている必要があります。


[2003 年 10 月 23 日]